import allure
import re
import pytest
from playwright.sync_api import Page, expect

"""
测试接入allure生成测试报告
1、本地安装allure命令行工具
2、项目安装allure-pytest依赖

allure测试报告框架使用方法
1、启动测试用例添加参数：pytest --alluredir=./allure-results（可在pytest.ini中统一加）
2、生成测试报告：allure generate ./allure-results -o ./allure-report
3、启动一个本地服务查看报告：allure open -h localhost -p 8080 ./allure-report
"""


"""用户登录
函数注解：
    @allure.feature：用于对测试用例进行最高层次的分类和组织，比如某某系统的测试
    @allure.story：表名测试用例所属的故事，一般是用来描述一个小的功能模块，比如用户管理
    @allure.title：描述单个测试用例的名称，比如用户登录
    @pytest.mark.parametrize：数据驱动测试，标名参数输入，避免在代码中写死，参数可以来源子yaml、数据库、excel等
函数入参：
    chromium_browser：显式引用测试夹具，夹具的定义详见.common.common_fixture，注意名称要保持一致，也可以加@pytest.mark.usefixtures注解
    base_url：环境基础路径，固定写法，配置详见pytest.ini
代码逻辑：
    allure.step：标名测试的步骤，在POM页面对象模型中，每一步都用函数来实现，此时可以用注解@allure.step代替
    
运行命令：
    pytest -s --headed --slowmo=500 --screenshot=only-on-failure --video=retain-on-failure --tracing=retain-on-failure --alluredir=./allure-results ./demo/13_allure_pytest.py
    
"""
@allure.feature("任务调度中心UI测试")
@allure.story("登录和登出模块")
@allure.title("用户登录")
# @pytest.mark.parametrize("username,password",[["admin","123456"],["admin","1234567"]])
@pytest.mark.parametrize("username,password",[["admin","123456"]])
def test_login(page: Page,username,password) -> None:

    # 会自动凭借上pytest.ini配置文件中的base_url
    page.goto("/xxl-job-admin/toLogin")

    with allure.step(f"输入账号:{username}"):
        page.get_by_placeholder("请输入登录账号").fill(username)

    with allure.step(f"输入密码:{password}"):
        page.get_by_placeholder("请输入登录密码").fill(password)

    with page.expect_navigation(url="**/xxl-job-admin/"):
        with allure.step(f"点击登录"):
            page.get_by_role("button", name="登录").click()

    expect(page).to_have_url(re.compile(".*/xxl-job-admin/"))
    locator = page.locator("xpath=//header")
    expect(locator).to_contain_text(username)

